package com.test.learnkotlin

/*
    https://www.jianshu.com/p/d79c44b450c1
 */
fun main() {
    val numbers = listOf("one", "two", "three", "four", "five", "six")
    //slice()返回具有给定索引的集合元素列表。
    println("----------------- slice()返回具有给定索引的集合元素列表。 ----------------------------")
    println(numbers.slice(0..3))
    println(numbers.slice(0..4 step 2))
    println(numbers.slice(listOf(3, 5, 0)))
    //----------------- slice()返回具有给定索引的集合元素列表。 ----------------------------
    //[one, two, three, four]
    //[one, three, five]
    //[four, six, one]

    //Take 与 Drop
    //take()从头获取指定数量的元素，takeLast()从尾开始获取。
    //
    //drop()从头去除指定数量的元素，dropLast()从尾开始去除。
    println("----------------  Take 与 Drop ------------------------------")

    val numbers2 = listOf("one", "two", "three", "four", "five", "six")
    println(numbers2.drop(2))
    println(numbers2.dropLast(2))
    println(numbers2.take(3))
    println(numbers2.takeLast(2))
    //----------------  Take 与 Drop ------------------------------
    //[three, four, five, six]
    //[one, two, three, four]
    //[one, two, three]       // 说明  drop 去除 元素 返回list ， 不会改变 原集合元素
    //[five, six]

    println("----------------  takeWhile 与 dropWhile ------------------------------")

    //takeWhile()：不停获取元素直到排除与谓词匹配的首个元素。
    //
    //takeLastWhile()：从集合末尾获取与谓词匹配的元素区间。
    //
    //dropWhile()：返回从首个与谓词不匹配的元素到末尾元素。
    //
    //dropLastWhile()：返回从开头到最后一个与谓词不匹配的元素。
    //

    val numbers3 = listOf("one", "two", "three", "four", "five", "six")
    println(numbers3.takeWhile { !it.startsWith('f') })
    println(numbers3.takeLastWhile { it != "three" })
    println(numbers3.dropWhile { it.length == 3 })
    println(numbers3.dropLastWhile { it.contains('i') })
    //----------------  takeWhile 与 dropWhile ------------------------------
    //[one, two, three]
    //[four, five, six]
    //[three, four, five, six]
    //[one, two, three, four]


    println("----------------  Chunked ------------------------------")

    //Chunked
    //chunked()：将集合分解为给定大小的块。参数：块的大小；返回值：一个List其中包含给定大小的List。
    val numbers4 = (0..13).toList()
    println(numbers4.chunked(3))
    println(numbers4.chunked(3) { it.sum() })

    //----------------  Chunked ------------------------------
    //[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12, 13]]
    //[3, 12, 21, 30, 25]

    //随机顺序
    //shuffled()函数返回以随机顺序排序的新List。
    println("----------------  随机顺序 ------------------------------")
    val numbers5 = (0..6).toList()
    println(numbers5.shuffled())
    //[0, 2, 5, 6, 4, 3, 1]


    //高级求和函数
    println("----------------  高级求和函数 ------------------------------")
    println(numbers5.sumOf { it * 2 })//sumBy 已过时
    //[0, 2, 5, 6, 4, 3, 1] 加在一起等于 21， 乘 2 等于 42


}